Amazon ECS คืออะไร? แนะนำฟังก์ชันของ AWS สำหรับผู้เริ่มต้นใช้งาน
บทความนี้ได้รับการแปลมาจากบทความภาษาญี่ปุ่นที่มีชื่อว่า AWS再入門ブログリレー2022 Amazon ECS編 โดยเจ้าของบทความนี้คือคุณ toku-shun ซึ่งเป็นชาวญี่ปุ่น และในบทความนี้จะมีการปรับสำนวนการเขียน รวมถึงมีการเรียบเรียงเนื้อหาใหม่ให้เข้าใจง่ายและมีความเหมาะสมมากยิ่งขึ้น
ในบทความนี้เราจะนำเหล่าสมาชิกที่โดยปกติแล้วเขียนแต่บล็อกเกี่ยวกับเนื้อหาล่าสุดของ AWS แบบละเอียดลงลึก กลับมาเขียนบทความอธิบายเนื้อหาพื้นฐานต่าง ๆ แบบเบสิกกันอีกครั้งครับ
โดยบทความนี้ก็ตามชื่อ สำหรับผู้ที่ตั้งใจจะเรียนเกี่ยวกับ AWS รวมถึงผู้ที่ใช้งาน AWS อยู่แล้ว แต่อยากจะติดตามเนื้อหาหรืออัปเดตใหม่ ๆ ก็อยากจะให้อ่านบทความนี้ไปจนจบเลยครับ
ถ้าอย่างนั้นเราก็มาเริ่มกันเลยครับ โดยหัวข้อในครั้งนี้ คือ「Amazon ECS」
Amazon ECS คืออะไร
ถ้าให้พูดแบบรวม ๆ ECS คือ「Full Managed Container Orchestrator」ครับ
โดยปกติแล้ว container workload จะใช้งานกันในรูปแบบของการนำ host หลาย ๆ ตัวมารวมกันเป็น cluster และบน host เหล่านั้นจะมี container หลาย ๆ ตัวที่ทำงานร่วมกันอยู่ และ ECS ก็เป็น full managed orchestrator service ที่ใช้สำหรับจัดการ container workload เหล่านี้ครับ
เราสามารถตั้งค่าและจัดการสิ่งต่าง ๆ เหล่านี้ได้โดยใช้ ECS ครับ
- การจัดการ container deployment
- การกระจายโหลดโดยใช้ Load Balancer
- การติดตามสถานะของ container และการ recovery แบบอัตโนมัติ
- การทำ container scaling
- การจัดการ IAM permission ของ container
- การรวบรวม CloudWatch Metrics / Logs
การใช้งาน ECS นั้น นอกจากความรู้เกี่ยวกับ Docker แล้ว ก็ยังจำเป็นจะต้องมีความรู้เกี่ยวกับตัว ECS เองอีกด้วย ซึ่งอาจจะเข้าใจยากสำหรับผู้ที่พึ่งเริ่มต้นใช้งาน ECS ดังนั้นในบทความนี้จะทำการอธิบายความรู้เกี่ยวกับ ECS โดยแบ่งอธิบายเป็นส่วน ๆ ประกอบด้วย data plane กับ control plane ครับ
Data plane
หมายถึง สภาพแวดล้อมสำหรับรัน container ซึ่งจะแบ่งออกเป็น 3 แบบหลัก ๆ ตามด้านล่างนี้
1. ECS on Fargate
ECS on Fargate คือ「Full Managed Data Plane」ครับ
สามารถรัน container ได้โดยไม่จำเป็นต้องคิดถึงเรื่อง host เลยแม้แต่นิดเดียว คล้าย ๆ กับ AWS Lambda ที่สามารถใช้งานได้โดยไม่จำเป็นต้องคิดถึงเรื่องการจัดการ resource ครับ
มีข้อดีต่าง ๆ เช่น ทุ่นแรงเกี่ยวกับงานจำพวกการอัปเดตแพทช์หรือจัดการ OS ของ infra ต่าง ๆ ลงได้ รวมถึงเรื่องการ scaling host ก็ไม่ต้องคิดให้ปวดหัวด้วยครับ
แต่ข้อเสียก็มีเช่นกัน เช่น เราจะไม่สามารถตั้งค่า OS parameter ต่าง ๆ แบบละเอียดตามต้องการได้ หรือการที่ไม่สามารถ login เข้าไปใน host ที่รัน container ได้ เป็นต้นครับ
ในช่วงแรก ๆ นั้น Fargate จะมีค่าบริการที่ค่อนข้างแพง แต่พักหลังมานี้ค่าบริการค่อย ๆ ถูกลงเรื่อย ๆ จนกลายมาเป็นตัวเลือกอันดับหนึ่งสำหรับ data plane บน ECS ไปแล้วครับ
และเพราะการที่เราไม่ต้องมาเสียเวลาอัปเดตแพทช์ของ host เองนั้น เป็นข้อดีที่ใหญ่หลวงมาก จึงอยากให้ลองพิจารณาการใช้งาน ECS on Fargate ดูครับ
2. ECS on EC2
ECS on EC2 คือ「Data plane ที่รันบน EC2」ครับ
เราสามารถรัน ECS container บน EC2 ได้โดยการรัน Amazon ECS Container Agent ที่ติดตั้งอยู่ใน EC2 ตัวดังกล่าวครับ โดยที่เรายังคงสามารถจัดการ container ที่รันอยู่บน EC2 นั้นผ่าน ECS ได้อยู่ และนอกจากนี้ EC2 ที่สร้างขึ้นโดย ECS จะใช้ AMI ที่ Amazon เตรียมไว้ให้ ซึ่งมี Amazon ECS Container Agent ติดตั้งอยู่เรียบร้อยแล้ว ทำให้ไม่จำเป็นต้องติดตั้งเองต่างหาก
ข้อดีและข้อเสียของ ECS on EC2 ก็จะตรงกันข้ามกับ ECS on Fargate ครับ คือ เราสามารถตั้งค่า parameter หรือเวอร์ชันของ host เองได้ตามใจ หรือ login เข้าไปใน host เพื่อปรับแต่งการตั้งค่าต่าง ๆ เองรวมถึงการตรวจสอบ logs ได้
ในส่วนของข้อเสียก็คือ เราจำเป็นจะต้องจัดการเรื่อง OS, Middleware, การอัปเดตแพทช์ หรือการจัดการ cluster เองครับ
3. ECS Anywhere
ECS Anywhere คือ「Data plane ที่รันบน On-premises」ครับ
เป็นการรัน container บนอุปกรณ์ hardware machine ชองเราเอง ซึ่งอาจจะเป็น data center หรือ office เป็นต้น โดยที่ control plane จะเป็น full managed ซึ่งรันบน AWS ครับ
ข้อดีของ ECS Anywhere คือ เราสามารถจัดการ host ได้ไปจนถึงระดับ hardware แต่สิ่งนี้ก็สามารถกลายมาเป็นข้อเสียได้ ขึ้นอยู่กับมุมมองและความต้องการใช้งานด้วย
ส่วนใหญ่แล้วจะใช้งาน ECS Anywhere เมื่อมีเงื่อนไขเกี่ยวกับความปลอดภัยต่าง ๆ ที่ไม่อนุญาตให้นำ resource ไปรันบน AWS เป็นต้น
Control Plane
Control plane จะประกอบไปด้วย 4 ส่วนหลัก ๆ ดังนี้
1. Task Definition
คือ template ของ Task ที่เขียนอยู่ใน JSON format ครับ แต่ก็สามารถสร้างได้ผ่านหน้า console เช่นกัน
เขียนระบุถึงรายละเอียดการตั้งค่าต่าง ๆ ของ task เช่น environment variable / image ที่จะใช้สำหรับสร้าง container / ปริมาณ memory, CPU ของแต่ละ task หรือ container เป็นต้น
Task Definition 1 ไฟล์ สามารถเขียนตั้งค่า container หลาย ๆ อันได้ และ Task Definition 1 อันก็สามารถใช้สร้าง container หลาย ๆ อันได้เช่นกันครับ
2. Task
คือ หน่วยของ application ที่สร้างขึ้นโดยใช้ Task Definition ครับ
เราสามารถรัน application ได้ โดยการใช้ Task Definition สร้าง Task ขึ้นมา
3. Service
คือ Scheduler สำหรับรักษาจำนวน running Task ให้เป็นไปตามจำนวนที่กำหนดเอาไว้ ครับ
อ่านคำนิยามด้านบนแล้วอาจจะไม่ค่อยเข้าใจนัก ผมจะขออธิบายเพิ่มเติมด้านล่างนี้ครับ
โดยปกติเราอาจรัน Task เป็นจำนวนหลาย ๆ Task พร้อมกัน เพื่อให้สามารถรองรับกับผู้ใช้งานจำนวนมากได้ แต่ Task นั้นสามารถหยุดทำงานลงได้หากมีเหตุขัดข้องบางอย่างเกิดขึ้น หน้าที่ของ Service คือการใช้ Task Definition สร้าง Task ใหม่ขึ้นมาแทน Task ที่หยุดทำงานลง เพื่อรักษาจำนวน running Task ให้คงที่ โดยจำนวน running Task นั้นเราสามารถกำหนดเองได้ครับ
นอกจากนี้การใช้งาน Service ยังช่วยกระจายโหลดไปให้แต่ละ Task หรือทำ Task scaling ได้
4. Cluster
คือ กลุ่มของ Task หรือ Service ครับ
หรือถ้าพูดให้ถูกกว่านี้ก็คือ กลุ่มของ resource ที่สร้างขึ้นใน Data Plane
ลองใช้งาน
ในส่วนของการทดลองใช้งาน ECS นี้ บทความต้นฉบับเลือกที่จะทำตาม Hands On อันนี้ แต่พอผมลองคลิกเข้าไปดูก็ปรากฎว่า Hands On นี้บินไปซะแล้วครับ อาจจะเนื่องมาจากบทความต้นฉบับนี้ค่อนข้างเก่า เพราะฉะนั้นผมจะถือโอกาสดัดแปลงแผนภาพที่อยู่ในบทความต้นฉบับให้เรียบง่ายขึ้นครับ
และเนื่องจากบทความนี้เป็นการสาธิตให้เห็นถึงการใช้งาน ECS เฉย ๆ ไม่ใช่บทความสำหรับสอนการใช้งาน เพราะฉะนั้นผมจะอธิบายแค่แบบคร่าว ๆ ไม่ลงรายละเอียดมากนะครับ
ส่วนตัว Hands On ที่บินไป หลังจากลองไปค้นหาเพิ่มเติมดูผมก็ไปเจอเข้ากับหน้า Hands On อันใหม่ของ ECS ครับ ซึ่งสำหรับท่านที่อยากเรียนรู้วิธีใช้งาน ECS แบบละเอียดกว่าในบทความนี้ก็สามารถไปเข้าไปดูได้ที่ลิงก์ด้านล่างนี้
สร้าง Cluster
ก่อนอื่นก็เริ่มจากการสร้าง cluster ก่อนครับ ให้ไปที่หน้า console ของ ECS เลือกเมนู Clusters
ทางด้านซ้าย จากนั้นคลิกที่ Create cluster
ในส่วนของ Cluster configuration ให้ตั้งชื่อ cluster ตามใจชอบ
ส่วน Infrastructure ให้เลือก infrastructure ที่ต้องการ ในครั้งนี้ผมจะทดลองสร้าง service ที่รันทั้งบน Fargate และ EC2 ดังนั้นผมจึงเลือกทั้งคู่เลยครับ
ซึ่งสำหรับ infrastructure แบบ EC2 เราจะต้องตั้งค่า Auto Scaling Group (ASG) และ Network setting ด้วย โดยทุกท่านสามารถตั้ง ASG ได้ตามต้องการ ซึ่งในครั้งนี้ผมจะตั้งค่าตามในภาพครับ
ส่วน network setting ก็เป็นแค่การเลือก VPC, subnets, และ security group ให้กับ EC2 ใน cluster ของเราครับ ซึ่งสามารถตั้งค่าได้ตามความต้องการ
Security group ผมเปิด inbound rule port 80 แค่นั้นเลยครับ
สำหรับท่านใดที่ยังไม่ค่อยคุ้นเคยกับการตั้งค่าในส่วนนี้ สามารถศึกษาเพิ่มเติมเกี่ยวกับ VPC, subnets, security group ได้ที่บทความด้านล่างนี้ครับ
การใช้งาน VPC ในเชิงปฏิบัติกับ EC2 | DevelopersIO
เมื่อตั้งค่าทุกอย่างเสร็จแล้ว ให้เลื่อนลงมาด้านล่างแล้วคลิกที่ Create
เพื่อสร้าง cluster
ECS on Fargate
ในส่วนของ Fargate ผมจะลองทำตามแผนภาพด้านล่างนี้
อธิบายแบบคร่าว ๆ ก็คือ เราจะสร้าง service ที่มี task รันอยู่จำนวน 1 task โดยที่ task นี้จะรันบน Fargate ครับ
สร้าง Task definitions
ไปที่หน้า console ของ ECS เลือกเมนู Task definitions
ทางด้านซ้าย จากนั้นคลิกที่ Create new task definition
→ Create new task definition
ที่บริเวณ Task definition configuration ให้ตั้งชื่อ Task definition ตามต้องการ จากนั้นในส่วนของ Launch type ให้เลือก AWS Fargate
ต่อมาให้เรากำหนดปริมาณ resource, IAM role ต่าง ๆ ที่จะมอบให้ Task เพื่อนำไปใช้ในการรัน container ใน Task
จากนั้นเลื่อนลงไปด้านล่าง ในส่วนของ Container ให้เราตั้งค่า container ที่จะรันใน Task
ทำการตั้งชื่อ container, image, port, และ resource ที่จะมอบให้กับ container ได้ตามใจชอบ รวมถึงการตั้งค่าเพิ่มเติมต่าง ๆ เช่น docker entry point, cmd, label เป็นต้น
ซึ่ง image ที่ผมจะใช้ในครั้งนี้ คือ public.ecr.aws/ecs-sample-image/amazon-ecs-sample:latest
ซึ่งเป็นตัว sample image ที่ AWS แจกให้ใช้ฟรี ๆ ครับ ซึ่งหน้าตาของแอพพลิเคชันที่ deploy ด้วย image นี้จะมีหน้าตาประมาณนี้
สำหรับรายละเอียดเพิ่มเติมเกี่ยวกับ image ดังกล่าวสามารถอ่านได้เพิ่มเติมที่นี่เลยครับ
ในกรณีที่อยากรัน container ใน task มากกว่า 1 container สามารถคลิกที่ Add container
แล้วตั้งค่า container เพิ่มเติมได้
ด้านล่างก็มีให้ตั้งค่าอะไรต่าง ๆ เพิ่มเติม เช่น Storage, Monitoring ก็ให้ตั้งค่าตามต้องการ เมื่อพอใจแล้วให้เลื่อนมาด้านล่างสุด คลิก Create
เพื่อสร้าง Task definition
สร้าง Services
เมื่อมี Cluster แล้ว และมี Task definition แล้ว เราก็พร้อมจะสร้าง Service กันแล้วครับ ให้กลับมาที่หน้า Cluster ที่เราสร้างไว้ (อย่างของผมก็คือ my-cluster
) จากนั้นที่แถบเมนูด้านล่าง ให้เลือก Services
และคลิกที่ Create
ในส่วนของ Environment ผมจะตั้งค่าตามในภาพ โดยเลือก Capacity provider เป็น FARGATE
เพื่อให้ Service deploy Task บน Fargate
จากนั้นในส่วนของ Deployment configuration ก็ทำการเลือก Task definition ของ Fargate ที่สร้างไว้ตอนแรก ตั้งชื่อ Service แล้วเลือกจำนวน Task ที่ต้องการ
ส่วนของ Networking ก็ตามภาพครับ เลือก VPC, Subnet, Security group ให้กับ Task และผมเลือกติด public IP ให้กับ Task เพื่อให้ Task เชื่อมต่อ internet ได้ เอาไว้ใช้เวลา pull Docker image สร้าง container
ส่วนต่อมาคือ Load balancing ส่วนนี้จะทำหรือไม่ทำก็ได้ แต่ผมอยากได้ก็เลยเปิดไว้ครับ ผมเลือกเป็นแบบ Application แล้ว listen port 80
จากนั้นเลื่อนมาด้านล่างสุดแล้วคลิก Create
ได้เลยครับ
ที่เหลือก็นั่งรอ Service สร้างเสร็จ
เมื่อ Service สร้างเสร็จก็จะมีหน้าตาประมาณในภาพด้านล่าง
จะเห็นว่ามี Task รันอยู่ 1 Task
คลิกเข้าไปที่ Service ของเรา ไปที่เมนู Configuration and networking
จากนั้นบริเวณมุมขวาล่างจะเห็น DNS names
อยู่ นั่นคือ URL สำหรับเปิดแอพของเราครับ
เปิดเข้าไปดูก็จะเห็นแอพที่เรา deploy ไว้
คราวนี้ผมจะลองเพิ่มจำนวน Task ใน Service ให้เป็น 2 Task ครับ ซึ่งโครงสร้างก็จะประมาณรูปด้านล่างนี้
ให้กลับมาที่ Service ของเรา คราวนี้ไปที่เมนู Tasks
จะเห็น Task ของเราที่รันอยู่ คลิกที่ Update service
เปลี่ยน Desired tasks
จาก 1 เป็น 2
เมื่อกลับมาที่เมนู Tasks
อีกครั้ง ก็จะเห็นว่ามี Task เพิ่มขึ้นมาเป็น 2 Tasks แล้ว
ลบ Services
สร้างแล้วก็ต้องลบครับ เริ่มจากการไปที่ Service ที่เราสร้างไว้ (ของผมคือ my-ecs-fargate-service
) แล้วคลิกที่ Delete service
ตรงมุมบนขวา
จะพบว่าเราต้องลบจำนวน Task ใน Service ให้เหลือ 0 ก่อน ถึงจะสามารถลบ Service ได้ (จริง ๆ แล้วเราสามารถทำการ Force delete เพื่อลบ Service โดยไม่จำเป็นต้อง scale down ก่อนก็ได้ แต่ในครั้งนี้เราจะลบแบบธรรมดา)
เพราะฉะนั้นให้เราไปที่ Update service
แล้วปรับจำนวน Task ให้เหลือ 0 ก่อน
จากนั้นพอจำนวน Task เหลือ 0 แล้ว ก็คลิกที่ Delete service
อีกครั้ง
จากนั้นก็ทำตามคำแนะนำที่เขียนไว้แล้วลบ Service ได้เลยครับ
ECS on EC2
ในส่วนของ EC2 ผมจะลองทำตามแผนภาพด้านล่างนี้
อธิบายแบบคร่าว ๆ ก็คือ เหมือนกับตอน Fargate ทุกอย่างครับ แค่คราวนี้ host จะเปลี่ยนจาก Fargate เป็น EC2
สร้าง Task definitions
ไปที่หน้า console ของ ECS เลือกเมนู Task definitions
ทางด้านซ้าย จากนั้นคลิกที่ Create new task definition
→ Create new task definition
ตั้งชื่อ task definition ตามต้องการเหมือนเดิม แต่คราวนี้ Launch type ให้เลือก Amazon EC2 instances
จากนั้นก็กำหนดปริมาณ resource, IAM role ต่าง ๆ ที่จะมอบให้ Task เพื่อนำไปใช้ในการรัน container ใน Task
ถ้าลองย้อนขึ้นไปดู ตอนสร้าง Cluster ผมเลือก EC2 ตัวเล็กเอาไว้ (t2.nano) เพราะฉะนั้นผมจะลดปริมาณ resource ของ Task ลง ไม่งั้นเดี๋ยว EC2 จะรับไม่ไหว
ในส่วนของ Container ผมตั้งค่าเหมือนตอน Fargate เลยครับ
แค่นี้ก็ถือว่าเสร็จสิ้นการสร้าง Task definition ของ EC2 ครับ
สร้าง Services
ไปที่หน้า Cluster ของเรา จากนั้นที่เมนู Services
ให้คลิกที่ Create
ในส่วนของ Environment รอบนี้เลือก Capacity provider เป็น EC2 (อันที่ไม่มีคำว่า FARGATE อยู่ในชื่อ)
Deployment configuration ก็ทำการเลือก Task definition ของ EC2 ที่สร้างไว้ ตั้งชื่อ Service แล้วเลือกจำนวน Task ที่ต้องการ
ส่วนของ Networking ก็เหมือนเดิมครับ แต่ EC2 เราอยู่ใน public subnet อยู่แล้ว ก็เลยไม่มีปัญหาเรื่องเชื่อมต่อ internet
Load balancing เหมือนกับตอน Fargate
จากนั้นเลื่อนมาด้านล่างสุดแล้วคลิก Create
ได้เลยครับ
แล้วก็นั่งรอ Service สร้างเสร็จอีกรอบ
เมื่อ Service สร้างเสร็จก็จะมีหน้าตาประมาณในภาพด้านล่าง
จะเห็นว่ามี Task รันอยู่ 1 Task
คลิกเข้าไปที่ Service ของเรา ไปที่เมนู Configuration and networking
แล้วหา DNS names
เพื่อลองเปิดแอพของเรา
เปิดเข้าไปดูก็จะเห็นแอพที่เรา deploy ไว้เหมือนเดิม
แต่เนื่องจาก EC2 ตัวค่อนข้างเล็ก จึงไม่น่าจะรัน Task 2 อันพร้อมกันไหว รอบนี้ก็เลยไม่ได้ลอง scale up ดูครับ
ลบ Service
วิธีลบ Service ใน EC2 ก็เหมือนกับ Fargate เลยครับ
เริ่มจากลบ Task ใน Service ออกให้เหลือ 0
จากนั้นก็ลบ Service ได้เลย
สุดท้ายนี้
สำหรับบทความ ECS นี้ก็ต้องจบลงเพียงเท่านี้ครับ หลังจากนี้ก็น่าจะมีอัปเดตอะไรเพิ่มเข้ามาเรื่อย ๆ ทุก ๆ ท่านก็อย่าลืมอัปเดตข่าวสารกันด้วยนะครับ
อ้างอิง
- AWS再入門ブログリレー2022 Amazon ECS編 | DevelopersIO (บทความต้นฉบับ)